package com.chenfan.mcn.dao;

import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.chenfan.common.extension.mybatisplus.enhanced.EnhancedBaseMapper;
import com.chenfan.mcn.model.ContractExcutionOrder;
import com.chenfan.mcn.model.IncomeContract;
import com.chenfan.mcn.model.IncomeContractAgreement;
import com.chenfan.mcn.model.McnPage;
import com.chenfan.mcn.model.dto.AnnualRebateQueryContractDTO;
import com.chenfan.mcn.model.dto.IncomeContractSearchDTO;
import com.chenfan.mcn.model.dto.LiveContractQueryDto;
import com.chenfan.mcn.model.dto.UnPayBackContractDTO;
import com.chenfan.mcn.model.vo.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * @author tangwei
 * Date:     2021/1/20 11:03
 * Description: 收入合同
 */
@Mapper
public interface IncomeContractMapper extends EnhancedBaseMapper<IncomeContract> {

    /**
     * 年度优惠含平台返点：所有合同的商务确认合同金额的总合
     *
     * @param customerId
     * @param endTime
     * @param startTime
     * @return BigDecimal
     */
    BigDecimal getWithYearAmount(@Param("customerId") Long customerId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 年度优惠不含平台返点：合同类型是“散单-形式合同或者年度优惠-形式合同”的所有合同的商务确认合同金额的总合
     *
     * @param startTime
     * @param endTime
     * @param customerId
     * @return BigDecimal
     */
    BigDecimal getWithNoYearAmount(@Param("customerId") Long customerId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 获取收入合同分页列表
     *
     * @param dto
     * @param mcnPage
     * @return Page<IncomeContractListVO>
     */
    Page<IncomeContractListVO> getContractPage(McnPage<IncomeContractListVO> mcnPage, @Param("dto") IncomeContractSearchDTO dto);

    /**
     * 查询收入合同列表
     *
     * @param dto
     * @return List<BasicContractVO>
     */
    List<BasicContractVO> getContractList(@Param("dto") IncomeContractSearchDTO dto);

    /**
     * 獲取收入合同导出列表
     *
     * @param dto
     * @return List<IncomeContractExportVO>
     */
    List<IncomeContractExportVO> getExportPage(@Param("dto") IncomeContractSearchDTO dto);

    /**
     * 导出框架合同
     *
     * @param dto
     * @return List<LiveContractExportVO>
     */
    List<LiveContractExportVO> exportLiveContract(@Param("dto") IncomeContractSearchDTO dto);

    /**
     * 獲取收入合同导出列表
     *
     * @param dto
     * @return List<IncomeContractAgreementExportVO>
     */
    List<IncomeContractAgreementExportVO> getExportAgreementPage(@Param("dto") IncomeContractSearchDTO dto);

    /**
     * 获取收入合同下的所有补充协议
     *
     * @param incomeContractId {@link Long}
     * @return {@link List<IncomeContractAgreement>}
     */
    List<IncomeContractAgreementVO> selectByIncomeContractId(Long incomeContractId);

    /**
     * 获取收入合同详情信息
     *
     * @param id         {@link Long}
     * @param processIds
     * @param offlineCommissionProcessId
     * @return {@link IncomeContractVO}
     */
    IncomeContractVO infoData(Long id, List<Long> processIds, Long offlineCommissionProcessId);

    /**
     * 校验商务确认合同金额
     *
     * @param id {@link Long}
     * @return {@link List<ContractExcutionOrder>}
     */
    List<ContractExcutionOrder> confirmedAmount(Long id);

    /**
     * 年度优惠含平台返点的年度累计金额
     *
     * @param discountId {@link Long}
     * @param startTime  {@link Date}
     * @param now        {@link Date}
     * @return {@link BigDecimal}
     */
    BigDecimal getAnnualIncludingPlatformRebate(Long discountId, Date startTime, Date now);

    /**
     * 年度优惠不含平台返点的年度累计金额
     *
     * @param discountId {@link Long}
     * @param startTime  {@link Date}
     * @param now        {@link Date}
     * @return {@link BigDecimal}
     */
    BigDecimal getAnnualNotIncludePlatformRebate(Long discountId, Date startTime, Date now);

    /**
     * 仅年度优惠的年度累计金额
     *
     * @param discountId {@link Long}
     * @param startTime  {@link Date}
     * @param now        {@link Date}
     * @return {@link BigDecimal}
     */
    BigDecimal getAnnualAmount(Long discountId, Date startTime, Date now);

    /**
     * 客户投放金额（本月）
     *
     * @param page {@link McnPage}
     * @return
     */
    Page<CustomerInvestmentAmount> customerInvestmentAmount(McnPage<CustomerInvestmentAmount> page);

    /**
     * 签订收入合同总金额
     * @param beginOfMonth
     * @param endOfMonth
     * @return
     */
    BigDecimal incomeContractTotalAmount(@Param("beginOfMonth") Date beginOfMonth, @Param("endOfMonth") Date endOfMonth);

    /**
     * 合同签订情况（本月）
     *
     * @return {@link List<ContractSigning>}
     */
    List<ContractSigning> contractSigning();


    /**
     * 部门业绩情况(本月)
     *
     * @param departmentIds {@link List<Long>}
     * @return {@link List<DepartmentPerformance>}
     */
    List<DepartmentPerformance> departmentPerformance(List<Long> departmentIds);

    /**
     * 客户关联的合同、执行单信息
     *
     * @param customerId
     * @param mcnPage
     * @param processIds
     * @return CustomerContractInfoVO {@link CustomerContractInfoVO}
     */
    Page<CusIncomeContractVO> getCusIncomeContract(McnPage<CusIncomeContractVO> mcnPage, @Param("customerId") Long customerId, List<Long> processIds);

    /**
     * 获取该客户下，所有收入合同（状态为审批中、审批通过）的商务确认合同金额的累计值。
     *
     * @param customerId {@link Long}
     * @return {@link BigDecimal}
     */
    BigDecimal getHistoryAmount(Long customerId);

    /**
     * 该客户下，所有收入合同（状态为审批中、审批通过）&回款状态为已回款的商务确认合同金额的累计值。
     *
     * @param customerId {@link Long}
     * @return {@link BigDecimal}
     */
    BigDecimal getCollectionAmount(Long customerId);

    /**
     * 校验平台订单号唯一
     *
     * @param number {@link String}
     * @return {@link Integer}
     */
    Integer verifyPlatformOrderNumber(String number);

    /**
     * 获取历史平台订单号
     *
     * @return {@link List<String>}
     */
    List<String> getPlatformOrderNumber();

    /**
     * 获取列表合计金额（合同金额、回款金额）
     *
     * @param dto
     * @return IncomeAmountSumVO {@link IncomeAmountSumVO}
     */
    IncomeAmountSumVO getSumAmount(@Param("dto") IncomeContractSearchDTO dto);

    /**
     * 更新收入合同 必须加入@Param(Constants.ENTITY) 才会自动填充
     *
     * @param dto
     * @return
     */
    Integer updateIncomeContract(@Param(Constants.ENTITY) IncomeContract dto);

    /**
     * * 未回款合同
     *
     * @param page
     * @param unPayBackContractDTO
     * @return {@link UnPayBackContractVO}
     */
    @InterceptorIgnore(tenantLine = "true")
    Page<UnPayBackContractVO> unPayBackContract(Page<UnPayBackContractVO> page, @Param("dto") UnPayBackContractDTO unPayBackContractDTO);

    /**
     * 首页-累计回款金额、累计未回款金额、累计签单金额
     *
     * @param unPayBackContractDTO
     * @return GrandAmountVO {@link GrandAmountVO}
     */
    GrandAmountVO grandAmount(@Param("dto") UnPayBackContractDTO unPayBackContractDTO);

    /**
     * 首页-未回款排行
     *
     * @param userIds
     * @param page
     * @param unPayBackContractDTO
     * @return List<UnPayBackRankVO> {@link UnPayBackRankVO}
     */
    @InterceptorIgnore(tenantLine = "true")
    Page<UnPayBackRankVO> unPayBackRank(Page<UnPayBackRankVO> page, @Param("userIds") List<Long> userIds, @Param("dto") UnPayBackContractDTO unPayBackContractDTO);

    /**
     * 根据收入合同编号获取金额
     *
     * @param incomeCodes {@link List<String>}
     * @return BigDecimal
     */
    BigDecimal getAmountOfMoney(List<String> incomeCodes);

    /**
     * 根据收入合同编号-查询季度性收入合同信息
     *
     * @param contractCodes
     * @return
     */
    List<QuarterIncomeContractVO> selectQuarterIncomeContracts(@Param("contractCodes") List<String> contractCodes);

    /**
     * 首页-合品牌作排名
     * @param page
     * @param pageNum
     * @param pageSize
     * @param tenantId
     * @return
     */
    @InterceptorIgnore(tenantLine = "true")
    Page<RankingOfCooperativeBrands> rankingOfCooperativeBrands(Page<RankingOfCooperativeBrands> page, @Param("pageNum") long pageNum, @Param("pageSize") long pageSize, @Param("tenantId") long tenantId);

    /**
     * 统计返回
     *
     * @param page      分页
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return Page<DepartmentCollectionRate>
     */
    Page<DepartmentCollectionRate> summaryReturn(Page<ReturnRate> page, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 通过code获取收入合同
     * @param contractCode
     * @param tenantId
     * @return
     */
    @InterceptorIgnore(tenantLine = "true")
    IncomeContract getByCode(@Param("contractCode") String contractCode, Long tenantId);

    /**
     * 客户返点审批单-查询收入合同
     * @param page
     * @param queryContractDTO
     * @return
     */
    Page<AnnualRebateIncomeContractListVO> queryIncomeContractByPage(Page<AnnualRebateIncomeContractListVO> page, @Param("dto") AnnualRebateQueryContractDTO queryContractDTO);


    /**
     * 查询待认领的直播合同
     * @param page
     * @param dto
     * @return
     */
    Page<LiveContractSelectVO> queryUnClaimLiveContract(Page<LiveContractSelectVO> page, @Param("dto")  LiveContractQueryDto dto);
}